home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / shells / kiss-0.11 / kiss-0 / kiss / src / expandalias.c < prev    next >
C/C++ Source or Header  |  1995-03-23  |  2KB  |  78 lines

  1. #include "kiss.h"
  2.  
  3. Stringstack expandalias (Stringstack s)
  4. {
  5.     Stringstack
  6.     ret;
  7.     register int
  8.     i,
  9.     j,
  10.     arg,
  11.     appended = 0;
  12.     register char
  13.     *space,
  14.     *cp;
  15.     char
  16.     buf [FILENAMELEN],
  17.     twobuf [2] = { 0, 0 };
  18.  
  19.     ret.str = NULL;
  20.     ret.nstr = 0;
  21.  
  22.     if ( (i = isalias (s.str [0])) != -1 )
  23.     {
  24.     /* split off first  ; separated part */
  25.     if (strstr (alias [i].str [1], " ; "))
  26.     {
  27.         strcpy (buf, alias [i].str [1]);
  28.         cp = strstr (buf, " ; ");
  29.         *cp = '\0';
  30.         if (! (space = strtok (buf, " ")) )
  31.         addstringtostack (&ret, buf);
  32.         else
  33.         {
  34.         addstringtostack (&ret, space);
  35.         while ( (space = strtok (NULL, " ")) )
  36.         addstringtostack (&ret, space);
  37.         }
  38.         
  39.         strcpy (bufferedinput, cp + 3);
  40.     }
  41.     else
  42.         ret = copystringstack (alias [i], 1, 1);
  43.  
  44.     /* loop thru all arguments */
  45.     for (j = 2; j < alias [i].nstr; j++)  
  46.     {
  47.         /* copy alias parts to buf, expanding $1 $2 etc. */
  48.         buf [0] = '\0';
  49.         for (cp = alias [i].str [j]; *cp; cp++)
  50.         if (*cp == '$')
  51.         {
  52.             if ( (arg = atoi (cp + 1)) && arg < s.nstr && arg > 0)
  53.             strcat (buf, s.str [arg]);
  54.             appended++;
  55.             while (isdigit (* (cp + 1)) )
  56.             cp++;
  57.         }
  58.         else
  59.         {
  60.             twobuf [0] = *cp;
  61.             strcat (buf, twobuf);
  62.         }
  63.         if (buf [0])
  64.         addstringtostack (&ret, buf);
  65.     }
  66.  
  67.     /* if no $1 etc. expanded: add stuff from the command */
  68.     if (! appended)
  69.         for (i = 1; i < s.nstr; i++)
  70.         addstringtostack (&ret, s.str [i]);
  71.     }
  72.     else
  73.     ret = copystringstack (s, 0, s.nstr - 1);
  74.  
  75.     return (ret);
  76. }
  77.     
  78.